import 'dart:async'; // 用于 EventHandler
import 'dart:io' show Platform; // 用于 Platform.isAndroid/isIOS
import 'dart:convert'; // 用于 json.decode

import 'package:flutter/material.dart';
// 导入 JPush 插件的主文件
import 'package:jpush_flutter/jpush_flutter.dart'; 
// 导入 JPushFlutterInterface 接口，JPush.newJPush() 返回的是这个接口类型
import 'package:jpush_flutter/jpush_interface.dart'; 


// 定义一个全局的 navigatorKey，用于在任何地方进行路由跳转
// GoRouter 推荐将这个 key 传递给 GoRouter 构造函数
final GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();

class JPushService {
  // 单例模式
  static final JPushService _instance = JPushService._internal();
  factory JPushService() => _instance;
  JPushService._internal();

  // ***** 核心修正：通过 JPush.newJPush() 获取 JPushFlutterInterface 实例 *****
  final JPushFlutterInterface _jpush = JPush.newJPush();
  // *******************************************************************


  /// 初始化 JPush 服务
  Future<void> init() async {

    // 1. 调用 JPush 插件的 setup 方法进行初始化和配置
    // 这里的 appKey 必须与你在极光控制台创建应用时生成的 AppKey 完全一致。
    // production 参数控制推送环境，务必在发布时设为 true。
    // debug 参数控制 JPush SDK 内部日志，开发阶段设为 true。
    _jpush.setup( // 现在 _jpush 是 JPushFlutterInterface 类型，拥有 setup 方法
      appKey: 'ce5d7e164f388433e78f2fa7', // !!! 替换为你在极光控制台获取的 AppKey !!!
      channel: 'developer-default', // 你的通知渠道，Android 需要
      production: false, // !!! 开发阶段为 false, 发布时改为 true !!!
      debug: true, // 开发阶段设为 true，控制 SDK 内部日志
    );

    // 2. 设置 JPush 事件监听器 (使用 addEventHandler 回调方式)
    _setupJPushListeners();

    // 3. 获取注册 ID (Registration ID)
    await _getRegistrationID(); // 现在 _jpush 是 JPushFlutterInterface 类型，拥有 getRegistrationID 方法

  }

  /// 设置 JPush 事件监听器
  void _setupJPushListeners() {
    // 调用 JPush 插件的 addEventHandler 方法来注册回调
    _jpush.addEventHandler( // 现在 _jpush 是 JPushFlutterInterface 类型，拥有 addEventHandler 方法
      onReceiveNotification: (Map<String, dynamic> message) async {
        _handleNotificationMessage(message);
      },
      onOpenNotification: (Map<String, dynamic> message) async {
        _handleNotificationTap(message);
      },
      onReceiveMessage: (Map<String, dynamic> message) async {
        // 收到自定义消息（通常是开发者发送，不显示在通知栏，如聊天消息等）
      },
      onReceiveNotificationAuthorization: (Map<String, dynamic> message) async {
      },
      onConnected: (Map<String, dynamic> message) async {
      },
      // 其他事件处理器，根据你的需要添加
      // onNotifyMessageUnShow: (Map<String, dynamic> message) async { ... },
      // onInAppMessageClick: (Map<String, dynamic> message) async { ... },
      // onInAppMessageShow: (Map<String, dynamic> message) async { ... },
      // onCommandResult: (Map<String, dynamic> message) async { ... },
    );
  }

  /// 获取 JPush Registration ID (实例方法)
  Future<void> _getRegistrationID() async {
    try {
      // 现在 _jpush 是 JPushFlutterInterface 类型，拥有 getRegistrationID 方法
      String registrationID = await _jpush.getRegistrationID(); 
      if (registrationID.isNotEmpty) {
        // TODO: 将这个 registrationID 发送给你的后端服务器，与管理员用户ID关联并存储
      } else {
      }
    } catch (e) {
    }
  }

  /// 处理收到的通知消息（App 在前台时）
  void _handleNotificationMessage(Map<String, dynamic> message) {
  }

  /// 处理点击通知后的路由跳转
  void _handleNotificationTap(Map<String, dynamic> message) {

    Map<String, dynamic>? extras;
    if (Platform.isAndroid) {
      String? extrasJsonString = message['extras'] as String?;
      if (extrasJsonString != null && extrasJsonString.isNotEmpty) {
        try {
          extras = json.decode(extrasJsonString) as Map<String, dynamic>;
        } catch (e) {
        }
      }
    } else if (Platform.isIOS) {
      extras = message;
    }

    if (extras == null || extras.isEmpty) {
      return;
    }

    String? routeName = extras['route'] as String?;
    String? id = extras['id'] as String?;

    if (routeName != null) {
      if (routeName == '/reservation_details' && id != null) {
        // router.go(routeName, extra: {'id': id});
      } else if (routeName == '/chat_screen') {
        // router.go(routeName);
      } else {
        // router.go(routeName);
      }
    } else {
    }
  }

  /// 设置别名
  Future<void> setAlias(String alias) async {
    try {
      Map<dynamic, dynamic> result = await _jpush.setAlias(alias); // 实例方法
    } catch (e) {
    }
  }

  /// 删除别名
  Future<void> deleteAlias() async {
    try {
      Map<dynamic, dynamic> result = await _jpush.deleteAlias(); // 实例方法
    } catch (e) {
    }
  }

  /// 设置标签
  Future<void> setTags(List<String> tags) async {
    try {
      Map<dynamic, dynamic> result = await _jpush.setTags(tags); // 实例方法
    } catch (e) {
    }
  }
}